// by zhangxixnu 2010-06-21  welcome to visit my personal website http://www.zhangxinxu.com/
// textSearch.js v1.0 文字，关键字的页面纯客户端搜索
// 2010-06-23 修复多字母检索标签破碎的问题
// 2010-06-29 修复页面注释显示的问题
// 2013-05-07 修复继续搜素关键字包含之前搜索关键字没有结果的问题
// 不论何种情况，务必保留作者署名。 


(function ($) {

    $.fn.textSearch = function (str, options) {
        var defaults = {
            divFlag: true,
            divStr: " ",
            markClass: "search-mark",
            markColor: "red",
            nullReport: true,
            callback: function () {
                return false;
            }
        };
        var sets = $.extend({}, defaults, options || {}), clStr;
        if (sets.markClass) {
            clStr = "class='" + sets.markClass + "'";
        } else {
            clStr = "style='color:" + sets.markColor + ";'";
        }

        //对前一次高亮处理的文字还原		
        $("span[rel='mark']").each(function () {
            var text = document.createTextNode($(this).text());
            $(this).replaceWith($(text));
        });


        //字符串正则表达式关键字转化
        $.regTrim = function (s) {
            var imp = /[\^\.\\\|\(\)\*\+\-\$\[\]\?]/g;
            var imp_c = {};
            imp_c["^"] = "\\^";
            imp_c["."] = "\\.";
            imp_c["\\"] = "\\\\";
            imp_c["|"] = "\\|";
            imp_c["("] = "\\(";
            imp_c[")"] = "\\)";
            imp_c["*"] = "\\*";
            imp_c["+"] = "\\+";
            imp_c["-"] = "\\-";
            imp_c["$"] = "\$";
            imp_c["["] = "\\[";
            imp_c["]"] = "\\]";
            imp_c["?"] = "\\?";
            s = s.replace(imp, function (o) {
                return imp_c[o];
            });
            return s;
        };
        $(this).each(function () {
            var t = $(this);
            str = $.trim(str);
            if (str === "") {
                alert("关键字为空");
                return false;
            } else {
                //将关键字push到数组之中
                var arr = [];
                if (sets.divFlag) {
                    arr = str.split(sets.divStr);
                } else {
                    arr.push(str);
                }
            }
            var v_html = t.html();
            //删除注释
            v_html = v_html.replace(/<!--(?:.*)\-->/g, "");

            //将HTML代码支离为HTML片段和文字片段，其中文字片段用于正则替换处理，而HTML片段置之不理
            var tags = /[^<>]+|<(\/?)([A-Za-z]+)([^<>]*)>/g;
            var a = v_html.match(tags), test = 0;

            $.each(a, function (i, c) {

                if (!/<(?:.|\s)*?>/.test(c)) {//非标签
                    //开始执行替换
                    $.each(arr, function (index, con) {
                        if (con === "") { return; }
                        var reg = new RegExp($.regTrim(con), "g");
                        if (reg.test(c)) {

                            //正则替换
                            c = c.replace(reg, "♂" + con + "♀");
                            test = 1;
                        }
                    });

                    c = c.replace(/♂/g, "<span rel='mark' " + clStr + ">").replace(/♀/g, "</span>");
                    a[i] = c;
                }
            });
            //将支离数组重新组成字符串
            var new_html = a.join("");
            $(this).html(new_html);

            if ($("[rel=mark]").size()) {
                $($("[rel=mark]").get(0)).attr("id", "firstmark");
                window.location.hash = "";
                window.location.hash = "firstmark";
            }

            ////锚点
            //var range = document.body.createTextRange();
            //range.findText(str);
            //range.moveStart("character", 1);
            //alert("aaaa");

            //if(test === 0 && sets.nullReport){
            //	alert("没有搜索结果");	
            //	return false;
            //}
            callbackfun();
            //执行回调函数
            sets.callback();
        });
    };
})(jQuery);